package com.app.sgd.controller.action;

import java.util.ArrayList;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.util.LabelValueBean;

import com.app.sgd.business.dao.SQLMantenimientoDAO;
import com.app.sgd.business.facade.VariablesFacade;
import com.app.sgd.manager.SGDDispatchAction;
import com.app.sgd.model.bean.ClasificacionDocumentos;
import com.app.sgd.model.bean.TipoDocumento;
import com.app.sgd.util.Constants;
import com.app.sgd.util.DownloadUtil;
import com.app.sgd.util.SessionConstants;
import com.app.sgd.view.actionform.MantenimientoForm;

public class MantenimientoAction extends SGDDispatchAction{
	private static Logger logger = Logger.getLogger(MantenimientoAction.class);
	
	public ActionForward clasificacionDocumentos(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) throws Exception {
		try{
			VariablesFacade variablesFacade = new VariablesFacade();
			ArrayList lstPlazo = variablesFacade.getPlazo();
			request.getSession().setAttribute(SessionConstants.LISTA_PLAZO, lstPlazo);
			
			ArrayList lstEstados = new ArrayList();
			lstEstados.add(new LabelValueBean(Constants.LABEL_DEFAULT_ACTIVO,Constants.VALOR_DEFAULT_ACTIVO));
			lstEstados.add(new LabelValueBean(Constants.LABEL_DEFAULT_INACTIVO,Constants.VALOR_DEFAULT_INACTIVO));
			request.getSession().setAttribute(SessionConstants.LISTA_ESTADOS, lstEstados);
			
			SQLMantenimientoDAO sqlMantenimientoDAO = new SQLMantenimientoDAO();
			ArrayList lstClasificacionDocumentos = sqlMantenimientoDAO.listarClasificacionDocumentos();
			
			request.getSession().setAttribute(SessionConstants.LISTA_CLASIFICACION_DOCU, lstClasificacionDocumentos);
			
			return mapping.findForward("clasificacionDocumentos");
		}catch(Exception e){
			logger.error("[STD]: Error en clasificacionDocumentos "+e.getMessage());
			e.printStackTrace();
			return mapping.findForward("error");
		}
	}
	
	public ActionForward siguienteClasificacion(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) throws Exception {
		return mapping.findForward("clasificacionDocumentos");
	}

	public ActionForward regresarClasificacionDocumentos(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) throws Exception {
		return mapping.findForward("clasificacionDocumentos");
	}
	
	public ActionForward listarClasificacionDocumentos(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) throws Exception {
		try{
			request.getSession().removeAttribute(SessionConstants.LISTA_CLASIFICACION_DOCU);
			ArrayList lstClasificacionDocumentos = new ArrayList();
			SQLMantenimientoDAO sqlMantenimientoDAO = new SQLMantenimientoDAO();
			lstClasificacionDocumentos = sqlMantenimientoDAO.listarClasificacionDocumentos();
			
//			formdoc.setLstDocumentosPlazo(lstDocumentosPlazo);
			request.getSession().setAttribute(SessionConstants.LISTA_CLASIFICACION_DOCU, lstClasificacionDocumentos);
			
			return mapping.findForward("clasificacionDocumentos");
		}catch(Exception e){
			logger.error("[STD]: Error en listarClasificacionDocumentos "+e.getMessage());
			e.printStackTrace();
			return mapping.findForward("error");
		}
	}
	
	public void reset(ActionForm form,HttpServletRequest request){
		MantenimientoForm formdoc = (MantenimientoForm)form;
		formdoc.setCodClasificacion(new String());
		formdoc.setDescClasificacion(new String());
		formdoc.setOrdenClasificacion(new String());
		formdoc.setCodPlazoClasificacion(new String());
		formdoc.setDiasPlazoClasificacion(new String());
		formdoc.setEstadoClasificacion(new String());
		formdoc.setCheckValuesDocumentos(new String[0]);
		
		formdoc.setCodTipoMovimiento(null);
		formdoc.setCodTipoDocumento(null);
		formdoc.setDescTipoMovimiento(null);
		formdoc.setDescTipoDocumento(null);
		formdoc.setUploadPlantilla(null);
		formdoc.setNombrePlantilla(null);
		formdoc.setBytesPlantilla(null);
	}
	
	public ActionForward adicionarClasificacionDocumento(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) throws Exception {
		try{
			reset(form, request);
			MantenimientoForm formdoc = (MantenimientoForm)form;
			formdoc.setCodClasificacion(Constants.VALOR_DEFAULT_MENOS_UNO);
			return mapping.findForward("adicionarClasificacion");
		}catch(Exception e){
			logger.error("[STD]: Error en adicionarClasificacionDocumento "+e.getMessage());
			e.printStackTrace();
			return mapping.findForward("error");
		}
	}
	
	public ActionForward modificarClasificacionDocumento(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) throws Exception {
		try{
			String index = request.getParameter("index");
			ArrayList lstClasificacionDocumentos = (ArrayList)request.getSession().getAttribute(SessionConstants.LISTA_CLASIFICACION_DOCU);
			ClasificacionDocumentos clasificacionDocumentos = (ClasificacionDocumentos)lstClasificacionDocumentos.get(Integer.parseInt(index));
			
			MantenimientoForm formdoc = (MantenimientoForm)form;
			formdoc.setCodClasificacion(clasificacionDocumentos.getCodClasif());
			formdoc.setDescClasificacion(clasificacionDocumentos.getDescClasif());
			formdoc.setOrdenClasificacion(clasificacionDocumentos.getOrdenClasif());
			formdoc.setCodPlazoClasificacion(clasificacionDocumentos.getCodPlazo());
			formdoc.setDiasPlazoClasificacion(clasificacionDocumentos.getDiasPlazo());
			formdoc.setEstadoClasificacion(clasificacionDocumentos.getEstadoClasif());
			
			return mapping.findForward("modificarClasificacion");
		}catch(Exception e){
			logger.error("[STD]: Error en modificarClasificacionDocumento "+e.getMessage());
			e.printStackTrace();
			return mapping.findForward("error");
		}
	}
	
	public ActionForward anularClasificacionDocumento(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) throws Exception {
		try{
			MantenimientoForm formdoc = (MantenimientoForm)form;
			ArrayList lstClasificacionDocumentos = (ArrayList)request.getSession().getAttribute(SessionConstants.LISTA_CLASIFICACION_DOCU);
			String []sel = formdoc.getCheckValuesDocumentos();
			
			ArrayList lstClasificacionDocumentosEliminar = new ArrayList();
			for(int i=0,n=sel.length; i<n;i++){
				lstClasificacionDocumentosEliminar.add(lstClasificacionDocumentos.get(Integer.parseInt(sel[i])));
			}
			
			SQLMantenimientoDAO sqlMantenimientoDAO = new SQLMantenimientoDAO();
			int res[] = sqlMantenimientoDAO.anularClasificacionDocumentos(lstClasificacionDocumentosEliminar);
			
			lstClasificacionDocumentos = sqlMantenimientoDAO.listarClasificacionDocumentos();
			request.getSession().setAttribute(SessionConstants.LISTA_CLASIFICACION_DOCU, lstClasificacionDocumentos);
			
			formdoc.setCheckValuesDocumentos(new String[0]);
			
			return mapping.findForward("clasificacionDocumentos");
		}catch(Exception e){
			logger.error("[STD]: Error en anularClasificacionDocumento "+e.getMessage());
			e.printStackTrace();
			return mapping.findForward("error");
		}
	}
	
	public ActionForward actualizarClasificacionDocumento(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) throws Exception {
		try{
			MantenimientoForm formdoc = (MantenimientoForm)form;
			
			ClasificacionDocumentos clasificacionDocumentos = new ClasificacionDocumentos();
			clasificacionDocumentos.setCodClasif(formdoc.getCodClasificacion());
			clasificacionDocumentos.setDescClasif(formdoc.getDescClasificacion());
			clasificacionDocumentos.setEstadoClasif(formdoc.getEstadoClasificacion());
			clasificacionDocumentos.setOrdenClasif(formdoc.getOrdenClasificacion());
			clasificacionDocumentos.setCodPlazo(formdoc.getCodPlazoClasificacion());
			clasificacionDocumentos.setDiasPlazo(formdoc.getDiasPlazoClasificacion());
			
			SQLMantenimientoDAO sqlMantenimientoDAO = new SQLMantenimientoDAO();
			int res = sqlMantenimientoDAO.actualizarClasificacionDocumentos(clasificacionDocumentos);
			
			ArrayList lstClasificacionDocumentos = sqlMantenimientoDAO.listarClasificacionDocumentos();
			request.getSession().setAttribute(SessionConstants.LISTA_CLASIFICACION_DOCU, lstClasificacionDocumentos);
			
			return mapping.findForward("clasificacionDocumentos");
		}catch(Exception e){
			logger.error("[STD]: Error en anularClasificacionDocumento "+e.getMessage());
			e.printStackTrace();
			return mapping.findForward("error");
		}
	}
	
	
	/* TIPOS DE DOCUMENTOS - MOVIMIENTO */
	
	public ActionForward listadoTiposDocumentos(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) throws Exception {
		try{
			VariablesFacade variablesFacade = new VariablesFacade();
			
			ArrayList lstMovimientos = variablesFacade.getTipoMovimiento(1);
			request.getSession().setAttribute(SessionConstants.LISTA_TIPO_MOVIMIENTO, lstMovimientos);
			
			SQLMantenimientoDAO sqlMantenimientoDAO = new SQLMantenimientoDAO();
			ArrayList lstTiposDocumentos = sqlMantenimientoDAO.listadoTiposDocumentos();
			
			request.getSession().setAttribute(SessionConstants.LISTA_TIPO_DOCU_MOVIMIENTO, lstTiposDocumentos);
			
			return mapping.findForward("listadoTiposDocumentos");
		}catch(Exception e){
			logger.error("[STD]: Error en listadoTiposDocumentos "+e.getMessage());
			e.printStackTrace();
			return mapping.findForward("error");
		}
	}
	
	public ActionForward openFile(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) throws Exception {
		String index = request.getParameter("index");
		ArrayList lstTiposDocumentos = (ArrayList)request.getSession().getAttribute(SessionConstants.LISTA_TIPO_DOCU_MOVIMIENTO);
		TipoDocumento tipoDocumentoMovimiento = (TipoDocumento)lstTiposDocumentos.get(Integer.parseInt(index));
		
		String fileName = tipoDocumentoMovimiento.getNombrePlantilla();
		byte[] fileImageField = tipoDocumentoMovimiento.getBytesPlantilla();
		
		new DownloadUtil(servlet, request, response).openFile(fileName, fileImageField);
		return null;
	}
	
	public ActionForward editarTipoDocumentoMovimiento(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) throws Exception {
		try{
			String index = request.getParameter("index");
			ArrayList lstTiposDocumentos = (ArrayList)request.getSession().getAttribute(SessionConstants.LISTA_TIPO_DOCU_MOVIMIENTO);
			TipoDocumento tipoDocumentoMovimiento = (TipoDocumento)lstTiposDocumentos.get(Integer.parseInt(index));
			
			VariablesFacade variablesFacade = new VariablesFacade();
			
			ArrayList lstMovimientos = variablesFacade.getTipoMovimiento(0);
			request.getSession().setAttribute(SessionConstants.LISTA_TIPO_MOVIMIENTO, lstMovimientos);
			
			MantenimientoForm formdoc = (MantenimientoForm)form;
			formdoc.setIndiceTipoMovimiento(tipoDocumentoMovimiento.getIndiceTipoMovimiento());
			formdoc.setCodTipoMovimiento(tipoDocumentoMovimiento.getCodTipoMovimiento());
			formdoc.setCodTipoDocumento(tipoDocumentoMovimiento.getCodTipoDocumento());
			formdoc.setNombrePlantilla(tipoDocumentoMovimiento.getNombrePlantilla());
			return mapping.findForward("editarTipoDocumentoMovimiento");
		}catch(Exception e){
			logger.error("[STD]: Error en editarTipoDocumentoMovimiento "+e.getMessage());
			e.printStackTrace();
			return mapping.findForward("error");
		}
	}
	
	public ActionForward regresarListadoTiposDocumento(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) throws Exception {
		return mapping.findForward("listadoTiposDocumentos");
	}
	
	public ActionForward actualizarTipoDocumento(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) throws Exception {
		try{
			MantenimientoForm formdoc = (MantenimientoForm)form;
			
			TipoDocumento tipoDocumento = new TipoDocumento();
			tipoDocumento.setCodTipoMovimiento(formdoc.getCodTipoMovimiento());
			tipoDocumento.setCodTipoDocumento(formdoc.getCodTipoDocumento());
			tipoDocumento.setNombrePlantilla(formdoc.getUploadPlantilla().getFileName());
			tipoDocumento.setBytesPlantilla(formdoc.getUploadPlantilla().getFileData());
			
			SQLMantenimientoDAO sqlMantenimientoDAO = new SQLMantenimientoDAO();
			int res = sqlMantenimientoDAO.actualizarTiposDocumentoMovimiento(tipoDocumento);
			
			ArrayList lstTiposDocumentos = sqlMantenimientoDAO.listadoTiposDocumentos();
			request.getSession().setAttribute(SessionConstants.LISTA_TIPO_DOCU_MOVIMIENTO, lstTiposDocumentos);
			
			return mapping.findForward("listadoTiposDocumentos");
		}catch(Exception e){
			logger.error("[STD]: Error en actualizarTipoDocumento "+e.getMessage());
			e.printStackTrace();
			return mapping.findForward("error");
		}
	}
	
	public ActionForward adicionarTipoDocumento(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) throws Exception {
		try{
			reset(form, request);
//			MantenimientoForm formdoc = (MantenimientoForm)form;
			
			VariablesFacade variablesFacade = new VariablesFacade();
			
			ArrayList lstMovimientos = variablesFacade.getTipoMovimiento(0);
			request.getSession().setAttribute(SessionConstants.LISTA_TIPO_MOVIMIENTO, lstMovimientos);
			
			return mapping.findForward("editarTipoDocumentoMovimiento");
		}catch(Exception e){
			logger.error("[STD]: Error en adicionarTipoDocumento "+e.getMessage());
			e.printStackTrace();
			return mapping.findForward("error");
		}
	}
	
	public ActionForward eliminarTipoDocumento(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) throws Exception {
		try{
			MantenimientoForm formdoc = (MantenimientoForm)form;
			ArrayList lstTiposDocumentos = (ArrayList)request.getSession().getAttribute(SessionConstants.LISTA_TIPO_DOCU_MOVIMIENTO);
			String []sel = formdoc.getCheckValuesDocumentos();
			
			ArrayList lstTiposDocumentosEliminar = new ArrayList();
			for(int i=0,n=sel.length; i<n;i++){
				lstTiposDocumentosEliminar.add(lstTiposDocumentos.get(Integer.parseInt(sel[i])));
			}
			
			SQLMantenimientoDAO sqlMantenimientoDAO = new SQLMantenimientoDAO();
			int res[] = sqlMantenimientoDAO.eliminarTipoDocumentoMovimiento(lstTiposDocumentosEliminar);
			
			lstTiposDocumentos = sqlMantenimientoDAO.listadoTiposDocumentos();
			request.getSession().setAttribute(SessionConstants.LISTA_TIPO_DOCU_MOVIMIENTO, lstTiposDocumentos);
			
			formdoc.setCheckValuesDocumentos(new String[0]);
			
			return mapping.findForward("listadoTiposDocumentos");
		}catch(Exception e){
			logger.error("[STD]: Error en eliminarTipoDocumento "+e.getMessage());
			e.printStackTrace();
			return mapping.findForward("error");
		}
	}
}
